#include "app_pool.h"
#include <mqueue.h>
#include <pthread.h>
#include "log/log.h"
#include <stdlib.h>

static char *mq_name = "/app_pool_mq";
static mqd_t mqd;
static pthread_t *threads;  // 线程池(保存所有线程的标识)
static int thread_num;      // 线程池中线程的数量

void *thread_func(void *arg)
{
    Task task;
    // 不断从消息队列中获取任务并执行
    while (1)
    {
        ssize_t size = mq_receive(mqd, (char *)&task, sizeof(Task), NULL); // 阻塞式
        if (size == sizeof(Task))
        {
            task.tast_func(task.arg);

        }
    }
}

/**
 * 初始化
 */
int app_pool_init(int size)
{
    // 创建消息队列
    struct mq_attr attr;
    attr.mq_msgsize = sizeof(Task);
    attr.mq_maxmsg = 10;
    mqd = mq_open(mq_name, O_CREAT | O_RDWR, 0644, &attr);
    if (mqd == -1)
    {
        log_error("mq_open error");
        return -1;
    }

    // 创建线程池
    thread_num = size;
    // 给线程池分配空间
    threads = (pthread_t *)malloc(sizeof(pthread_t) * size);
    for (int i = 0; i < size; i++)
    {
        pthread_create(&threads[i], NULL, thread_func, NULL);
    }
    
    log_debug("初始化线程池成功");
    
    return 0;
}

/**
 * 关闭
 */
void app_pool_close()
{
    // 关闭删除消息队列
    mq_close(mqd);
    mq_unlink(mq_name);
    // 释放线程池 
    
    // 取消所有线程
    for (int i = 0; i < thread_num; i++)
    {
        pthread_cancel(threads[i]);
        pthread_join(threads[i], NULL);
    }
    // 释放线程池空间
    free(threads); 
}

/**
 * 注册任务
 */
// int app_pool_registerTask(Task *task);
int app_pool_registerTask(int (*tast_func)(void *), void *arg)
{
    // 创建任务
    Task *task = (Task *)malloc(sizeof(Task));
    task->tast_func = tast_func;
    task->arg = arg;
    
    mq_send(mqd, (char *)task, sizeof(Task), 0);
    free(task);

    // Task task = {
    //     .tast_func = tast_func,
    //     .arg = arg,
    // };
    // mq_send(mqd, (char *)&task, sizeof(Task), 0);

    // 将任务发送到消息队列
    return 0;
}